今天先來講組語的撰寫的結構與部分保留字。
結構主要為以下形式
標籤名稱: 指令內容與參數 ;註解
第一部分就是標籤的名稱,可以作為跳轉的位置,若沒有需要跳轉的需求則可以不使用標籤。
第二部分是指令與參數,相關指令可以到x86 and amd64 instruction reference先去察看有哪些指令與它的作用,還有該指令所需要的參數格式要求。
第三部分即註解,註解符號為 ;,在分號之後的文字都是註解,不會執行,但不支援多行註解。但若真的需要多行註解可以參考這個討論,使用
%if 0
(程式碼)
%endif
去做到多行註解的作用,類似於
/*
(程式碼)
*/
若指令長度過長需要換行繼續撰寫時可以將 \ 放在行末並換行撰寫,例如
push Hell\
oWorld
再來參數位元組數
名稱 | Byte數 | 初始化 | 未初始化 | |
---|---|---|---|---|
byte | 1 | db | resb | |
word | 2 | dw | resw | |
dword | 4 | dd | resd | double |
qword | 8 | dq | resq | quarter |
tword | 10 | dt | rest | ten |
oword | 16 | do | reso | oct |
yword | 32 | dy | resy | |
zword | 64 | dz | resz |
在 .data 區段中宣告變數時要用初始化那欄的保留字,例如
coin: dd 100
宣告 coin 的值為 100 大小為一個 Dword 即四個位元組。
在 .bss 區段則使用未初始化那欄的保留字,例如
coin: resd 1
宣告 coin 的大小為一個 Dword ,但未對此變數進行初始化。
而指令的部分可以到剛才提到的x86 and amd64 instruction reference這篇中去尋找想要使用的指令,例如 ADD
![[Pasted image 20220917222937.png]]
我們可以直接看 Instruction 與 Description 的欄位,以第一橫行為例,它的指令格式是
ADD AL, imm8
imm8 表示大小 8 bit的數字,因為 AL 是 8 bit 的暫存器,因此只能接受這樣子的範圍,所以若要使用這條指令, imm8 的位置只能是 0~255。
又以第六橫行為例,它的指令格式是
ADD r/m16, imm16
r/m16 為16 bit 大小的暫存器,關於暫存器的資料在後天會提到,因此先不多做討論,有興趣的可以先去搜尋,而 imm16 當然就是 16 bit 大小的數字範圍。
或許有人會問
這篇重要的原因是因為它提到了每個指令的寫法,所以如果在組譯時指令報錯的話可以參考一下這裡,看是不是因為指令的格式錯誤導致的。